//Project name: personal-diary-bm
//Author: Brunner Márton (YV2X56)

//Ez a fájl a felhasználóval való kapcsolat kialakítására használandó metódusokat tartalmaz.
//Pl. menü megjelenítése, és adatok beolvasása a billentyűzetről

#ifndef BMMENU_HPP
#define BMMENU_HPP
#include <iostream>
#include <string>
#include <cstdarg>

//numOptions : a menüpontok száma
//canCancel : legyen-e mégse opció
//options : elsõként a menü fejléce, majd a választási opciók
//Visszatérési érték a választott menüpont lesz, ha ez "Mégse", akkor 0 lesz
//!A metódus csak megfelelő számú adatra működik helyesen, de mivel csak fordítási időben ismert paraméterekkel fut le így ez nem probléma.
int Menu(int numOptions, bool canCancel, char* options, ...){
    va_list tmp;
    va_start(tmp, options);
    std::cout << std::endl;
    if(options!="") std::cout << options << std::endl;
    for(int i=1;i<=numOptions;++i){
        std::cout << i << ". " << va_arg(tmp, char*) << std::endl;
    }
    if(canCancel) std::cout << "0. Visszalepes" << std::endl;
    int ret = -1;
    int tmpmin = (canCancel?0:1);
    while(ret<tmpmin || ret>numOptions){
        std::cout << "Valasszon menupontot: ";
        std::cin >> ret;
        if(std::cin.fail()){
            ret=-1;
            std::cin.clear();
            std::cin.ignore(1000, '\n');
        }
        if(ret<tmpmin || ret>numOptions) std::cout << "Hibas opcio! ";
    }
    std::cin.sync();
    va_end(tmp);
    return ret;
}

//Ez a metódus menüfejlécek megjelenítésére használatos. Két paramétere van, az első a megjelenítendő szöveg, a második pedig az,
//hogy emeljünk a sort a felirat előtt.
void ShowHeader(std::string title, bool withEmptyLine=true){
    const std::string line = "==========";
    if(withEmptyLine) std::cout << std::endl;
    std::cout << line << " " << title << " " << line << std::endl;
}


//A felhasználótól adatot bekérő metódus
template <typename T>
T userInput(const std::string text){
    T ret;
    if(text!="") std::cout << text << std::endl;
    do{
        if(std::cin.fail()){
            std::cin.clear();
            std::cin.ignore(1000, '\n');
            std::cout << "Hibas adat! Kerem adjon meg ervenyes adatot: ";
        }
        std::cin >> ret;
    }while(std::cin.fail());
    std::cin.sync();
    return ret;
}

//Ez is felhasználói adatokat kér be, de itt csak string-et lehet bekérni.
//Beolvassa az elválasztójeleket is. Plusz funkció, hogy megadható egy felső korlát a beolvasandó szöveg hosszára.
//Amennyiben a felhasználó nem ad meg felső korlátot, úgy tetszőleges hosszúságú szöveg megadható
std::string userInput(const std::string text, unsigned int max_length=0){
    std::string ret;
    if(text!="") std::cout << text << std::endl;
    do{
        getline(std::cin, ret);
        std::cin.sync();
        if(ret.length()>max_length && max_length!=0) std::cout << "Legfeljebb " << max_length << " karakter hosszusagu szoveget adhat meg!" << std::endl;
    }while(ret.length()>max_length && max_length!=0);
    return ret;
}

#endif
